package service

import (
	"container/list"
	"fmt"
)

type Queue struct {
	items   *list.List
	maxSize int
}

// NewQueue 创建一个新的队列，并设置最大长度
func NewQueue(maxSize int) *Queue {
	return &Queue{
		items:   list.New(),
		maxSize: maxSize,
	}
}

// Enqueue 添加元素到队列末尾，如果队列已满则移除最早的元素再添加新元素
func (q *Queue) Enqueue(item interface{}) {
	if q.items.Len() >= q.maxSize {
		q.items.Remove(q.items.Front())
	}
	q.items.PushBack(item)
}

// Dequeue 从队列开头移除元素并返回，如果队列为空则返回错误
func (q *Queue) Dequeue() (interface{}, error) {
	if q.items.Len() == 0 {
		return nil, fmt.Errorf("queue is empty")
	}
	element := q.items.Front()
	q.items.Remove(element)
	return element.Value, nil
}

// Peek 查看队列开头的元素但不移除它，如果队列为空则返回错误
func (q *Queue) Peek() (interface{}, error) {
	if q.items.Len() == 0 {
		return nil, fmt.Errorf("queue is empty")
	}
	element := q.items.Front()
	return element.Value, nil
}

// IsEmpty 检查队列是否为空
func (q *Queue) IsEmpty() bool {
	return q.items.Len() == 0
}

// Size 返回当前队列的大小
func (q *Queue) Size() int {
	return q.items.Len()
}

// 遍历队列 并返回一个切片
func (q *Queue) ToSlice() []interface{} {
	var result []interface{}
	for e := q.items.Front(); e != nil; e = e.Next() {
		result = append(result, e.Value)
	}
	return result
}
